# 导入标准库
import os
# 导入 pyexpress 模块
import pyexpress as express

# 导入 路由模块
from router import hello as hello_router


app = express.Express()

@app.use
async def _(req, res, next):
    print('进入第一个中间件')
    next()

@app.use
def _(req, res, next):
    print('进入第二个中间件')
    next()

@app.use
async def _(req, res, next):
    print('进入第三个中间件')
    next()

@app.use
def _(req, res, next):
    print('进入第四个中间件')
    next()

# 输出所有请求的日志
@app.use
def _(req, res, next):
    reqTime = req.conn_time
    req.formatTime = express.tool.formatTime(reqTime)
    # 输出请求的日志 - 如果使用了反向代理 此处的地址可能不是客户端的 需要修改
    print(f'{req.addr} | {req.formatTime} | {req.method} {req.url} | ')
    next()

# 设置允许跨域请求
# 后续应该封装为框架内部的中间件
@app.use
def _(req, res, next):
    # 添加允许跨域的请求头
    # 设置允许跨域的源为所有源
    res.setHeader('Access-Control-Allow-Origin', '*')
    # 设置允许的HTTP方法为所有方法
    res.setHeader('Access-Control-Allow-Methods', '*')
    # 设置允许的请求头为所有头
    res.setHeader('Access-Control-Allow-Headers', '*')
    # 解决预检请求
    if (req.method == 'OPTIONS'):
        res.sendStatus(200)
        return
    # 进行下一个路由的调用
    next()

# 输出接收到的 json 数据
@app.use
def _(req, res, next):
    print('json 中间件之前', req.body)
    next()

# 设置http请求报文的长度限制为 15M 解析超时为 20s
# 服务端解析json数据的中间件
app.use(express.json(limit = 15 * 1024 * 1024, timeout = 20))

# 输出接收到的 json 数据
@app.use
def _(req, res, next):
    print('json 中间件之后', req.body)
    next()

# 输出接收到的 query 数据
@app.use
def _(req, res, next):
    print('urlencoded 中间件之前', req.url, req.path, req.query, req.fragment)
    next()

# 服务端解析GET请求参数的中间件 长度限制为 8K
app.use(express.urlencoded(limit = 8 * 1024))
# 服务端解析cookie的中间件（暂时不使用）
# app.use(cookieParser())

# 输出接收到的 query 数据
@app.use
def _(req, res, next):
    print('urlencoded 中间件之后', req.url, req.path, req.query, req.fragment)
    next()

# 挂载静态资源
current_dir = os.path.dirname(os.path.abspath(__file__))
app.use(express.static(os.path.abspath(os.path.join(current_dir, 'public'))))

'''
@app.use
def _(req, res, next):
    # 输出接收到的文件数据
    res.json({"msg": "读取不到该文件"})
    next()
'''

# 动态路由
app.use('/hello', hello_router)

# 404错误处理
@app.use
def _(req, res, next):
    res.status(404)
    res.sendFile(os.path.join(current_dir, './views/error.html'))
